package ar.utn.frba.ia.IA_TP1.mapas;

import java.util.ArrayList;
import java.util.List;

public abstract class Mapa {
	protected boolean[][] matrizAdy;
	protected List<Pais> paises;
	protected List<int[]> adyascencias = null;

	/**
	 * Es responsabilidad de la clase concreta llenar la variable protegida matrizAdy
	 */
	protected abstract void fillMatrizAdy();
	/**
	 * Es responsabilidad de la clase concreta llenar la variable protegida paises
	 */
	protected abstract void fillPaises();

	public Mapa() {
		paises = new ArrayList<Pais>();
		fillPaises();
		initMatrizAdy();
		fillMatrizAdy();
	}

	private void initMatrizAdy() {
		int paisSize = paises.size();
		this.matrizAdy = new boolean[paisSize][paisSize];
		for(int i = 0; i < paisSize; i++){
			for(int j = 0;j < paisSize;j++){
				this.matrizAdy[i][j]=false;
			}
		}
	}
	public List<Pais> getPaises() {
		return paises;
	}

	public boolean sonAdyascentes(int pais1, int pais2) {
		return matrizAdy[pais1][pais2];
	}

	public enum Colores{
		AZUL(0),
		ROJO(1),
		VERDE(2),
		NARANJA(3);

		private int n;

		private Colores(int color){
			n = color;
		}

		@Override 
		public String toString() {
			switch (n) {
			case 0:
				return "blue";
			case 1:
				return "red";
			case 2:
				return "green";
			case 3:
				return "yellow";
			default:
				return "black";
			}
		}

	}

	public List<int[]> getAdyascencias() {
		if (null != adyascencias) {
			return adyascencias;
		} else {
			adyascencias = new ArrayList<int[]>();
			for(int i = 0; i < matrizAdy.length-1; i++){
				for(int j = i+1; j < matrizAdy.length; j++){
					if(matrizAdy[i][j]){
						adyascencias.add(new int[] {i,j});
					}
				}
			}
			return adyascencias;
		}
	}
	
	public int getCantidadPaises(){
		return paises.size();
	}
}
